#include <stdint.h>
#include <stdbool.h>
#include "bsp_key.h"
#include "bsp_SysTick.h"
// 假设这些宏定义了按键的GPIO状态
// #define KeyUp      // 读取KeyUp按键状态的宏
// #define KeyDown    // 读取KeyDown按键状态的宏
// #define KeyConfirm // 读取KeyConfirm按键状态的宏

// 双击检测的时间窗口（毫秒）
#define DOUBLE_CLICK_TIME_WINDOW 200

// 静态变量用于跟踪按键状态和时间
static uint8_t key_up           = 1;
static uint8_t click_count      = 0;
static uint32_t last_click_time = 0;

// 模拟延时函数

//获取当前时间（毫秒）
uint16_t get_current_time(void);
extern uint16_t t6_i;

uint8_t DOU_KEY_Scan(uint8_t mode)
{
    static uint8_t last_key_state = 1; // 用于检测按键状态的变化
    uint8_t current_key_state     = (KeyUp == 1 && KeyDown == 1 && KeyConfirm == 1) ? 1 : 0;
    uint16_t current_time         = get_current_time();

    if (mode) {
        // 重置按键状态
        key_up          = 1;
        click_count     = 0;
        last_click_time = 0;
    }

    if (!current_key_state && last_key_state) {
        // 按键被按下
        uint32_t elapsed_time = current_time - last_click_time;

        if (key_up) {
            // 如果是首次按下，记录时间并增加计数器
            last_click_time = current_time;
            click_count++;

            if (click_count == 1) {
                // 等待一小段时间以确保不是双击的一部分
                delay_ms(10);
                key_up = 0; // 阻止立即的重复检测
            } else if (click_count == 2 && elapsed_time < DOUBLE_CLICK_TIME_WINDOW) {
                // 在双击时间窗口内检测到两次按下，触发双击事件
                click_count     = 0; // 重置计数器
                last_click_time = 0; // 重置时间
                key_up          = 1; // 准备下一次检测

                // 根据需要返回双击的键值，这里假设双击返回4
                return 4;
            }
        }
    } else if (current_key_state) {
        // 按键被释放
        key_up      = 1; // 准备下一次按键检测
        click_count = 0; // 重置计数器，因为按键已经释放
    }

    // 检测单击事件
    if (!current_key_state && !key_up) {
        delay_ms(10); // 去抖动
        if (!current_key_state) {
            key_up      = 1; // 准备下一次按键检测
            click_count = 0; // 重置计数器，因为已经处理了单击

            if (KeyUp == 0)
                return 1;
            else if (KeyDown == 0)
                return 3;
            else if (KeyConfirm == 0)
                return 2;
        }
    }

    // 更新按键状态
    last_key_state = current_key_state;

    return 0; // 无按键事件
}

// 模拟延时函数，根据具体平台实现

//获取当前时间（毫秒），根据具体平台实现
uint16_t get_current_time(void)
{
    t6_i = 0; 
    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
    return t6_i; // 注意：这里的时间戳是从系统启动或HAL_InitTick()调用时开始的
}